// import express
const express = require("express");
// import cors
const cors = require("cors");
// create express server
const app = express();
// 解析 url-encoded格式的表单数据
app.use(express.urlencoded({ extended: false }));
// 解析json格式的表单数据
app.use(express.json());
// 一定要在路由之前，封装req.cc函数
app.use(function (req, res, next) {
  // status = 0 为成功； status = 1 为失败； 默认将 status 的值设置为 1，方便处理失败的情况
  res.cc = function (err, status = 1) {
    res.send({
      // 状态
      status,
      // 状态描述，判断 err 是 错误对象 还是 字符串
      message: err instanceof Error ? err.message : err,
    });
  };
  next();
});
// 配置解析Token的中间件
// 导入配置文件
const config = require("./config");
// 解析Token的中间件
const expressJWT = require("express-jwt");
// app.js的全局错误级别中间件，捕获验证失败的错误，并把验证失败的结果响应给客户端
const joi = require("joi");

// load cors lib
app.use(cors());

// 响应数据的中间件 (优化res.send()代码)
// 多次调用res.send()向客户端响应处理失败的结果
// 为了简化代码手动封装一个res.cc()函数

// 使用.unless({path: [/^\/api\//]]})指定哪些接口不需要进行Token的身份认证
app.use(
  expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^\/api\//] })
);

// =================================== 路由模块导入 start =============================
// 导入用户路由模块
const userRouter = require("./router/user");
app.use("/api", userRouter);

// 导入并使用用户信息路由模块
const userinfoRouter = require("./router/userinfo");
app.use("/my", userinfoRouter);

// 导入文章管理路由模块
const artCateRouter = require("./router/artcate");
app.use("/my/article", artCateRouter);

// 导入文章路由模块
const articleRouter = require("./router/article");
const { application } = require("express");
// 为文章的路由挂载统一的访问前缀 /my/article
app.use("/my/article", articleRouter);
// =================================== 路由模块导入 end =============================

// error middleware
app.use(function (err, req, res, next) {
  // verification failure
  if (err instanceof joi.ValidationError) {
    return res.cc(err);
  }
  // 捕获身份认证失败的错误
  if (err.name === "UnauthorizedError") {
    return res.cc("身份认证失败！");
  }
});

// 在app.js中使用express.static()中间件，将uploads目录中的图片托管为静态资源
app.use("/uploads", express.static("./uploads"));
// invoke app.listen, assign port and start web server
app.listen(3007, function () {
  console.log("api server running at 127.0.0.1:3007");
});
